/**
 * FileName: LoginApi
 * Author: TangZaoBang
 * Date: 2023/06/05 13:09
 * Description:
 * <p>
 * History:
 * <author> TangZaoBang
 * <time> 2023/06/05 13:09
 * <version> 1.0.0
 * <desc> 版本描述
 */
package com.sd365.permission.centre.api;
import com.sd365.common.log.api.annotation.ApiLog;
import com.sd365.permission.centre.pojo.vo.ResourceVO;
import lombok.Data;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * @Class LoginApi
 * @Description 控制器实现此接口，该接口主要是提供登录服务，主要的调用者来自网关
 * @Author TangZaoBang
 * @Date
 * @Version 1.0.0
 */
@RequestMapping(value = "/permission/centre/v1")
public interface LoginApi {
    /**
     * @Class LoginController
     * @Description 内部类封装在UserVO中的用于返回角色资源信息
     * @Author TangZaoBang
     * @Date 2023/06/10 13:09
     * @version 1.0.0
     */
    @Data
    class ResponseData {
        /**
         * 生成的token ，token在认证服务生成比较合理
         */
        private String token;
        /**
         *  一个用户可以拥有多个角色这里是名字
         */
        private List<String> roles;
        /**
         *  名字
         */
        private String name;
        /**
         * 头像地址
         */
        private String avatar;
        /**
         *  用户所拥有的资源，如果在 Role对象中包含这个会更好
         */
        private List<ResourceVO> resourceVO;
    }
    @Data
    class UserVO {
        /**
         * 名字
         */
        private String name;
        /**
         * 电话号码
         */
        private String tel;
        /**
         * 主键雪花算法生成
         */
        private Long id;
        /**
         * 消息和错误码 这个设计不好，返回保卫已经被统一应答包装 CommonResponse的Head包含了 code和message 这里不需要了
         */
        private String msg;
        private Integer code;
        private Long tenantId;
        private String companyAddress;
        private Long orgId;
        private Long companyId;
        public ResponseData data;
        private List<Long> roleIds;
    }
    /**
     * 用于进行用户认证并返回带权限的UserVO对象
     * @author TangZaoBang
     * @date 2023/06/11 17:07
     * @param code 账号
     * @param password 密码
     * @param account 租户号
     * @return com.sd365.permission.centre.api.LoginApi.UserVO
     */
    @ApiLog
    @CrossOrigin
    @GetMapping(value = "/user/auth")
    @ResponseBody
    UserVO auth(@NotNull @RequestParam(value = "code") String code,@NotNull @RequestParam(value = "password") String password,@NotNull @RequestParam(value = "account") String account);

    /**
     * 重写登录
     * @author TangZaoBang
     * @date 2023/06/05 15:39
     * @param code 工号
     * @param password 密码
     * @param account 租户号
     * @return com.sd365.permission.centre.api.LoginApi.UserVO
     */
    @ApiLog
    @CrossOrigin
    @GetMapping(value = "/user/login")
    @ResponseBody
    UserVO login(@NotNull @RequestParam(value = "code") String code,
                 @NotNull @RequestParam(value = "password") String password,
                 @NotNull @RequestParam(value = "account") String account);

    /**
     * 前端认证完成后调用此方法获取用户信息，用户信息包含权限信息
     * @author TangZaoBang
     * @date 2023/06/07 14:57
     * @param code code 工号
     * @param account account 租户账号
     * @return com.sd365.permission.centre.api.LoginApi.UserVO
     */
    @ApiLog
    @CrossOrigin
    @GetMapping(value = "/user/info")
    @ResponseBody
    UserVO info(@NotNull @RequestParam(value = "code") String code,@NotNull @RequestParam(value = "account") String account);


    /**
     * 通过调用UserOnlineService强制退出登录
     * @author TangZaoBang
     * @date 2023/06/07 14:47
     * @return com.sd365.permission.centre.api.LoginApi.UserVO
     */
    @ApiLog
    @CrossOrigin
    @GetMapping(value = "/user/logout")
    @ResponseBody
    UserVO logout();
}
